Bili-helper 折腾记
前言
看不惯B站的夜间模式很久了,明明标榜深色跟随系统,结果居然需要手动杀掉后重启才会跟随
恰好学了一下Widget Kit,于是准备来一波demo,做一个iOS辅助客户端
准备
首先从这个 repo 了解了B站的基本API
开始
然后从认证开始入手
- 一是让用户输入账户信息后,App模拟代为发送后收集保存返回的Cookie(主要是SESSDATA),但这样安全性不高,而且还要加入打标的前端js代码,遂放弃
- 二是直接用类Safari原生网页组件,使用B站浏览器登录接口,然后拦截保存Cookie。
- UIWebView已经被弃用,所以使用推荐的WKWebView,貌似最开始这玩意不太好获取Cookie,并且Cookie写入跨进程共享是异步的。不过最后发现后来加了一个webView.configuration.websiteDataStore.httpCookieStore.getAllCookies 可以用于获取
- 然后在相应的生命周期中传递出去即可
#### 接下来是获取信息 使用 URLSession.shared.dataTask 获取 data,最后用 JSONDecoder().decode 成相应的数据即可
decode时有时候有多余的父级数据,想了n多方法还是没解决(用SwiftyJSON库等),最后只能强行套一层BiliResult解决
设计UI
设计App UI和Widget UI
Widget信息同步
因为Widget同样要获得UserInfo等信息,需要使用保存的SESSDATA,故二者间需要同步信息 最后采用App Groups + UserDefaults(suiteName:)解决
Note: ⚠️suiteName需要和group id一致
Widget无法使用URLImage
因为Widget中EntryView一旦发送就不能再改变(如动画、图片切换),所以在Widget中不能使用URLImage
解决方案: 重新撸了一个getImageData(for url:URL),在Widget的View中直接使用Data加载图片
alternative: 使用 URLSession.shared.downloadTask 得到一个本地图片文件(url),使用contentOfUrl加载图片